﻿#include "MyImage.h"

CMyImage::CMyImage(void)
{
}

CMyImage::~CMyImage(void)
{
}
//Chuyển từ ảnh màu sang ảnh xám
IplImage* CMyImage::RGB2Gray(IplImage *img){

	//Tạo 1 ảnh xám rỗng
	IplImage*grayImg=cvCreateImage(cvGetSize(this->img),IPL_DEPTH_8U,1);

	int imgHeight=this->img->height;
	int imgWidthStep=this->img->widthStep;
	int step=this->img->widthStep;
	int grayStep=grayImg->widthStep;

	uchar*data=(uchar*)this->img->imageData;
	uchar*grayData=(uchar*)grayImg->imageData;
	
	//Gán giá trị cho ảnh xám tạo bên trên
	for(int j=0;j<imgHeight*imgWidthStep-2;j+=this->img->nChannels){
		grayData[(int)j/3]=  (unsigned char) (
			0.299*data[j + 0] +
			0.587*data[j + 1] + 
			0.114*data[j+2] + 0.5);
	}

	return grayImg;
}

//Tính giá trị histogram cho ảnh xám
void CMyImage::CalcHist(IplImage *grayImg){

	for(int i=0;i<256;i++){
		this->histogram[i]=0;
	}

	int imgHeight=grayImg->height;
	int imgWidthStep=grayImg->widthStep;
	int step=grayImg->widthStep;

	//Tổng số pixel trong ảnh
	int n=grayImg->height*grayImg->width;

	uchar*data=(uchar*)grayImg->imageData;

	//Tính giá trị histogram cho từng giá trị màu [0,1]
	for (int i=0; i < imgHeight; i++) {
		   for (int j=0; j < imgWidthStep; j += grayImg->nChannels) {
				histogram[data[j]]+=(float)1/n;			
			}
			data+= step;			
	}

}
//Tìm max cho histogram
float CMyImage::MaxOfHist(){
	float max=this->histogram[0];
	for(int i=0;i<256;i++){
		if(histogram[i]>max)
			max=histogram[i];
	}
	return max;
}

IplImage* CMyImage::DrawHistogram(IplImage *grayImg,float colWidth,float maxHeight, CvScalar color){

	IplImage * histImg=cvCreateImage(cvSize(256*colWidth,maxHeight+15),8,3);
	CalcHist(grayImg);
	float max=MaxOfHist();
	

	// Vẽ histogram theo hình cột

	//Vẽ nền màu trắng cho histogram
	cvRectangle(histImg,cvPoint(0,0),cvPoint(histImg->width,histImg->height),cvScalar(255,255,255),CV_FILLED,8,0);

	//for(int i=0,j=0;i<256 && j<(256*colWidth);i++,j+=colWidth){
	//	
	//	float n=(this->histogram[i]*maxHeight)/max;
	//	cvRectangle(histImg,cvPoint(j,maxHeight),cvPoint(j+colWidth,maxHeight-n),cvScalar(255,0,0),1,8,0);

	//	//Vẽ dãy màu xám tăng dần từ đen đến trắng
	//	cvRectangle(histImg,cvPoint(j,maxHeight),cvPoint(j+colWidth,maxHeight+15),cvScalar(0,i,0),CV_FILLED,8,0);
	//}


	//Vẽ histogram theo đường 
	for(int i=0,j=0;i<256-1 && j<(256*colWidth);i++,j+=colWidth){
		
		float n=(this->histogram[i]*maxHeight)/max;
		float n1=(this->histogram[i+1]*maxHeight)/max;
		cvLine(histImg,cvPoint(j,maxHeight-n),cvPoint(j+colWidth,maxHeight-n1),cvScalar(255,0,0),2,8,0);

		cvRectangle(histImg,cvPoint(j,maxHeight),cvPoint(j+colWidth,maxHeight+15),cvScalar(i,0,0),CV_FILLED,8,0);

	}

	return histImg;

}

